你有一個很棒的 AWS 基礎設備架構,你花了一個禮拜設定在 AWS Console 建立並拉出這樣的架構,再花了一個月測試這樣的架構沒問題。
之後,在準備上正式環境的時候,發現一切的設定都要重新來過,再花一個禮拜設定,再花一個月測試,然後可能很不幸的,有些服務的設定已經忘記怎麼設定了,又得再花一個禮拜找原因。
這樣會不會太沒效率了!我們有沒有更有效率的方式來建立這些服務,以避免花這麼多時間呢?
CloudFormation,就是可以解決我們的需求的服務!
CloudFormation 是一個可以幫助我們快速建立 AWS 資源的服務。採用 基礎架構程式碼 (IaC) 的敘述方式,描述一個 Template,來告訴 CloudFormation 你想建立的資源,例如: EC2 Instance、RDS Instance。
之後 CloudFormation 就會依照你的描述,幫你建立、配置這些資源,所以你不用到各個資 源頁面,去個別建立和設定。這個服務幫助了我們以下:
CloudFormation 有以下幾個重要元件:
Template
Stack
Change Set
我們會透過 Template 開啟 Stack,在使用 Template 的時候,可以觀測 Change Set,確認會影響到的服務後建立出 Stack。
我們來說實際的使用情境:
首先需要先開 RDS,再來開 EC2 Instance,等待 EC2 Instance 裡面的應用程式完成後,再來啟用 ELB
上述的要求,主要有兩點:
DependsOn: 決定先後順序,在誰之後建立
WaitCondition: 等待前面完成,在尚未收到完成訊號前阻擋其他 AWS 服務建立資源
透過這兩個屬性來決定 AWS 服務之間的關聯性。
使用 CloudFormation 時,會把相關的資源透過 Stack 來表達跟管理。一個 Template 可以有多個 Stack,可以透過刪除 Stack 刪除一系列的 AWS 資源。
以下的 Template 就會建立一個 Stack 並有兩個 AWS 資源。
AWSTemplateFormatVersion: "2010-09-09"
Description: A sample template
Resources:
MyEC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: "ami-0ff8a91507f77f867"
InstanceType: t2.micro
KeyName: testkey
BlockDeviceMappings:
-
DeviceName: /dev/sdm
Ebs:
VolumeType: io1
Iops: 200
DeleteOnTermination: false
VolumeSize: 20
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyEC2Instance
這個 template 描述了一個 EC2 Instance
及 Elastic IP
在 Template 主要會分為以下幾個區塊
aws cloudformation describe-stacks
我們可以透過視覺化的方式,把 AWS 服務彼此之間要建立的資源關聯起來。
而 Designer 也可以自動生成 Template ,可以選擇輸出 JSON 或是 YAML,並且可以切成不同的組成條件去顯示(畢竟整個 Template 下來其實很不好閱讀)。
以下就是 CloudFormation Designer 的設計畫面。
採用 Chef 和 Puppet 的自動化操作,我們需要了解宜下 Chef 和 Puppet 是做什麼用途的,這兩個軟體可使用程式碼自動設定伺服器組態的自動化平台。
什麼意思呢? 也就是你為了新環境建立的 EC2 Instance,你需要更新、安裝新的套件,設定系統環境變數。這時候就輪到 OpsWorks 的幫忙了。
OpsWorks 支援以下三種:
在學習 AWS 的初學者,我認為 CloudFormation 還是有它存在的價值。你還是可以透過 CloudFormation 去確認你建立的 AWS 服務。
但是許多元件非常的不直覺,WaitCondition 需要搭配 WaitConditionHandle 才能達成,也沒有搭配自動完成的功能。
相較於 CloudFormation 我更喜歡 Terraform 這個軟體。因為我不會被綁死在 AWS 這朵公有雲上但是又能達成建立 AWS 資源的功能。
在 2019 年時,AWS 推出了全新的開發套件 AWS Cloud Development Kit (AWS CDK),透過利用 AWS CDK 套件,開發者可以定義整個雲端基礎架構使用程式的方法,同時提升可讀性,並可撰寫測試程式來減少失誤的可能性,也可以達到快速複製的效果。